package com.wwy.configuraion;

import com.alibaba.druid.util.StringUtils;
import com.wwy.listener.MessageReceiver;
import com.wwy.listener.RedisExpiredListener;
import com.wwy.listener.RedisKeyExpirationListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;

@Configuration
public class RedisListenerConfig {

    @Value("${redis.db}")
    private String db;

    @Bean//相当于xml中的bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter1, MessageListenerAdapter listenerAdapter2) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        // 加载哪个库
        if(StringUtils.isEmpty(db)){
            db = "0";
        }
        //订阅了一个叫chat 的通道
        container.addMessageListener(listenerAdapter1, new PatternTopic("chat"));
        //监听key值失效的状态
        container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@"+ db +"__:expired"));
        //redis失效key事件处理
        //container.addMessageListener(listenerAdapter1, new PatternTopic("__keyevent@"+ db +"__:expired"));
        //这个container 可以添加多个 messageListener
        return container;
    }

   /* @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);

        *//**下面这种方式是灵活配置，针对每个库的失效key做处理 start**//*
        if(StringUtils.isEmpty(db)){
            db = "0";
        }
        String pattern = "__keyevent@" + db + "__:expired";
        ////监听key值失效的状态
        container.addMessageListener(new RedisExpiredListener(), new PatternTopic(pattern));
        *//**针对每个库的失效key做处理 end **//*

        return container;
    }*/

    /**
     * 消息监听器适配器，绑定消息处理器，利用反射技术调用消息处理器的业务方法
     * @param receiver
     * @return
     */
    @Bean
    MessageListenerAdapter listenerAdapter1(MessageReceiver receiver) {
        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器，利用反射的方法调用“receiveMessage”
        //也有好几个重载方法，这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    @Bean
    MessageListenerAdapter listenerAdapter2(MessageReceiver receiver) {
        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器，利用反射的方法调用“receiveMessage”
        //也有好几个重载方法，这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
        return new MessageListenerAdapter(receiver, "receiveMessage2");
    }

    @Bean
    MessageListenerAdapter listtenerKeyExpiration(RedisKeyExpirationListener receiver) {
        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器，利用反射的方法调用“receiveMessage”
        //也有好几个重载方法，这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
        return new MessageListenerAdapter(receiver, "onMessage");
    }
}
